#include <stdio.h>
#include <stdlib.h>

//栈结构
typedef struct 
{
    int *data;//动态数组存储栈元素
    size_t size;//栈内元素个数
    size_t capacity;//动态数组的容量
}Stack;

//初始化栈
void initstack(Stack *stack, size_t capacity){
    stack->data = (int*)malloc(capacity * sizeof(int));//分配初始容量的内存
    stack->size = 0;//初始化元素个数
    stack->capacity = capacity;//设置容量
}

//返回栈内元素个数
size_t getsize(const Stack *stack){
    return stack->size;
}

//添加新元素
void push(Stack *stack,int element){
    if(stack->size == stack->capacity){
        //如果栈已满，需要扩展容量
        stack->capacity*=2;
        stack->data = (int*)realloc(stack->data, stack->capacity*sizeof(int));
    }
    stack->data[stack->size] = element;//将元素压入栈顶
    stack->size++;//更新元素个数
}

//栈顶元素出栈并返回
int pop(Stack *stack){
    if(stack->size == 0){
        return -1;
    }
    stack->size--;//更新元素个数
    return stack->data[stack->size];//返回栈顶元素
}

//释放占内存
void destoryStack(Stack *stack){
    free(stack->data);//释放动态数组内存
    stack->data = NULL;
    stack->size = 0;
    stack->capacity = 0;
}

int main(){
    Stack mystack;
    //初始化栈
    initstack(&mystack, 2);
    printf("初始化栈成功，初始容量为2\n");

    //向栈压入元素
    push(&mystack, 1);
    push(&mystack, 2);
    printf("站内元素个数：%zu\n",getsize(&mystack));
    //弹出栈顶元素
    printf("弹出栈顶元素：%d\n",pop(&mystack));
    //释放栈内存
    destoryStack(&mystack);
    printf("内存已释放\n");
    return 0;
}